package com.zmn.plat.business.interfaces.channel;

import com.zmn.common.dto.KvDTO;
import com.zmn.mcc.cas.model.LoginStaff;
import com.zmn.plat.common.dto.area.AreaSimpleDRO;
import com.zmn.plat.common.dto.channel.ChannelBrandSiteAddDIO;
import com.zmn.plat.common.dto.channel.ChannelDRO;
import com.zmn.plat.common.exception.PlatException;
import com.zmn.plat.model.entity.channel.*;
import com.zmn.plat.model.entity.channel.order.config.ChannelOrderConfig;
import com.zmn.plat.model.vo.channel.ChannelCityPriceRatioVo;
import com.zmn.plat.model.vo.servcategory.ServAssCategoryVO;

import java.util.List;

/**
 * 渠道新
 *
 * @author xiangjunming
 * @since 2019 /08/19 16:51:39
 */
public interface ChannelBService {

    /**
     * 根据渠道ID获取渠道信息（基本信息和订单配置信息）
     *
     * @param channelId
     * @return
     */
    ChannelDRO getByChannelId(Integer channelId);

    /**
     * 搜索渠道
     *
     * @param plat             平台标识，1言而有信，2啄木鸟，3一步维修，4川南环保，Null不限
     * @param type             渠道类型，1政企渠道，2商家渠道，3厂家渠道，4自有渠道，5推广渠道，6服务商渠道，Null不限
     * @param channelOneDeptId 一级部门，Null不限
     * @param channelDeptId    二级部门，Null不限
     * @param parentId         1级渠道Id，Null不限
     * @param status           状态，1禁用，2启用，Null不限
     * @return 渠道Id 、渠道名称和状态字段列表
     */
    List<Channel> listChannelVtByQuery(Integer staffId, Integer plat, Integer type, Integer channelOneDeptId, Integer channelDeptId, Integer parentId, Integer status);

    /**
     * 搜索渠道
     *
     * @param plat             平台标识，1言而有信，2啄木鸟，3一步维修，4川南环保，Null不限
     * @param type             渠道类型，1政企渠道，2商家渠道，3厂家渠道，4自有渠道，5推广渠道，6服务商渠道，Null不限
     * @param channelOneDeptId 一级部门，Null不限
     * @param channelDeptId    二级部门，Null不限
     * @param parentId         1级渠道Id，Null不限
     * @param status           状态，1禁用，2启用，Null不限
     * @param keyword          渠道名称，支持中文及拼音模糊搜索，Null不限
     * @return 渠道Id 、渠道名称和状态字段列表
     */
    List<Channel> listChannelVtByQuery(Integer staffId, Integer plat, Integer type, Integer channelOneDeptId, Integer channelDeptId, Integer parentId, Integer status, String keyword);

    /**
     * 通过渠道ID获取服务区域下开通的城市，以及城市对应的省份信息
     *
     * @param channelId
     * @return
     */
    List<AreaSimpleDRO> listAreaByChannelId(Integer channelId);

    /**
     * 描述：每天早上9点扫描全表-商务信息缺失发送钉钉消息
     * @param
     * @author  hewenlang
     * @since 2022/1/7 11:05
     */
    void listByDimissionChannel() throws Exception;

    /**
     * 新增渠道
     *
     * @param channel the channel
     * @author xiangjunming
     * @since 2019 /9/5
     */
    void addChannel(ChannelAddVO channel, LoginStaff mcStaff);

    /**
     * 描述: 新建渠道订单配置
     *
     * @param channel channel
     * @author jiafei
     * @since 2022/1/14 13:41
     */
    void addChannelOrderConfig(ChannelAddVO channel);

    /**
     * 描述: 渠道结算信息
     *
     * @version v1.0
     * @param channel channel
     * @author jiafei
     * @since 2022/1/14 14:50
     */
    void addChannelSettle(Channel channel);

    /**
     * 新增品牌站渠道
     *
     * @param channelBrandSiteAddDIO
     */
    Channel addBrandSiteChannel(ChannelBrandSiteAddDIO channelBrandSiteAddDIO);

    /**
     * 新增接口来源渠道-啄金客二级渠道等
     *
     * @param channel the channel
     */
    void addCpsChannel(Channel channel);

    /**
     * 修改渠道基本信息
     *
     * @param channel the channel new
     * @author xiangjunming
     * @since 2019 /9/5
     */
    void modifyBaseInfoByKey(Channel channel, LoginStaff mcStaff);

    /**
     * 新增/修改渠道订单配置
     *
     * @param channelOrderConfig the record
     * @return the int
     */
    void modifyOrderConfig(ChannelOrderConfig channelOrderConfig);

    /**
     * 根据ID修改选择的字段
     *
     * @param record the record
     * @return the int
     */
    void updateByKeySelective(Channel record);

    /**
     * 根据ID修改渠道内部名称
     *
     * @param record the record
     * @return void
     */
    void updateInnerName(Channel record);

    /**
     * 更新排序
     *
     * @param channelId
     * @param sort
     * @param mcStaffName
     * @return
     * @author xiangjunming 20191014
     */
    void updateSortByKey(Integer channelId, Integer sort, String mcStaffName);

    /**
     * 批量修改状态：2启用，1停用
     *
     * @param channelIds 渠道ID
     * @param status     状态 2启用，1停用
     * @param updater    操作人
     * @modifier jiafei 渠道关闭时通知全连CC 以及 通知渠道客户管理中的渠道客户对应关闭 2021/7/30 15:56
     */
    void modifyStatusByIds(List<Integer> channelIds, Integer status, String updater);

    /**
     * 根据id更新状态
     *
     * @param channel
     */
    void updateStatusByKey(Channel channel);

    /**
     * 保存渠道服务分类：增加判断条件：需要校验 所选择的服务分类+二级产品分类下是否有已上架的前台产品
     *
     * @param channelId    渠道ID
     * @param servCategId  服务分类ID
     * @param switchStatus 通用产品是否开通开关状态
     * @param showType     产品分类 1后台 2前台
     * @param categoryIds  服务分类ID-1级分类ID-2级分类ID
     * @param operator     the operator
     * @author xiangjunming
     * @since 2019 /9/5
     */
    void modifyChannelServiceCategory(Integer channelId, Integer servCategId, Integer switchStatus, Integer showType, List<String> categoryIds, String operator);

    /**
     * 新增渠道时候，新增渠道服务分类
     *
     * @param channelId   渠道ID
     * @param showType    产品分类 1后台 2前台
     * @param categoryIds 服务分类ID-1级分类ID-2级分类ID
     * @param operator    the operator
     * @author xiangjunming
     * @since 2019 /9/5
     */
    void addChannelServiceCategory(Integer channelId, Integer showType, List<String> categoryIds, String operator);

    /**
     * 保存渠道区域服务分类
     *
     * @param serviceAreaId 服务区域ID
     * @param servCategId   服务分类ID
     * @param channelId     渠道ID
     * @param showType      产品分类 1后台 2前台
     * @param categoryIds   服务分类ID-1级分类ID-2级分类ID
     * @param operator      the operator
     */
    void modifyChannelServiceAreaCategory(Integer serviceAreaId, Integer servCategId, Integer channelId, Integer showType, List<String> categoryIds, String operator);

    /**
     * 批量保存渠道区域服务分类
     *
     * @param batchAreaServCategoryVO
     */
    void batchModifyChannelServiceAreaCategory(ChannelBatchAreaServCategoryVO batchAreaServCategoryVO);

    /**
     * 收退款押金
     *
     * @param channelId 渠道ID
     * @param type      类型：1收款，2退款
     * @param amount    金额（分）
     * @param operator  操作人
     * @param remark    备注说明
     * @author xiangjunming
     * @since 2019 /9/5
     */
    void inOrOutDeposit(Integer channelId, Integer type, Integer amount, String operator, String remark);

    /**
     * 新增服务区域
     *
     * @param areaIds   the area ids
     * @param channelId the channel id
     * @param operator  the operator
     * @author xiangjunming
     * @since 2019 /8/27
     */
    void addServiceArea(List<Integer> areaIds, Integer channelId, String operator);

    /**
     * 新增全国城市服务区域
     *
     * @param channelId the channel id
     * @param operator  the operator
     * @author xiangjunming
     * @since 2019 /8/27
     */
    void addAllCityServiceArea(Integer channelId, String operator);

    /**
     * 移除服务区域
     *
     * @param serviceAreaIds the service area ids
     * @param operator       the operator
     * @author xiangjunming
     * @since 2019 /8/27
     */
    void deleteServiceArea(List<Integer> serviceAreaIds, String operator);

    /**
     * 查询渠道全部等级分类[服务分类->产品一级分类->产品二级分类]
     *
     * @param channelId 渠道ID
     * @param showType  产品分类 1后台 2前台
     * @return key =分类ID, value=分类名称, children=下级分类
     */
    List<KvDTO<Integer, String>> listAllLevelCategoryByChannelId(Integer channelId, Integer showType);

    /**
     * 修改渠道区域地图
     *
     * @param vo the vo
     */
    void modifyDrawChannelAreaMap(ChannelServiceArea vo);

    /**
     * 修改渠道佣金
     *
     * @param commissions
     * @param operator    the operator
     * @author xiangjunming
     * @since 2019 /9/5
     */
    void modifyCommissions(List<ChannelCommission> commissions, String operator);

    /**
     * 修改渠道佣金
     *
     * @param commission the commission
     * @param operator   the operator
     * @author xiangjunming
     * @since 2019 /9/5
     */
    void modifyCommission(ChannelCommission commission, String operator);

    /**
     * 修改渠道结算
     *
     * @param settle   the settle
     * @param operator the operator
     * @author xiangjunming
     * @since 2019 /9/5
     */
    void modifySettle(ChannelSettle settle, String operator);

    /**
     * 初始发送MQ结算信息
     *
     * @param operator
     * @return
     */
    boolean initSendMQSettle(String operator);

    /**
     * 根据渠道ID获取是否通知工程师（工单超时预警后）
     *
     * @param channelId
     * @author linfeng
     * @since 2020/10/10 11:04
     */
    boolean checkNotifyEngineer(Integer channelId) throws PlatException;

    /**
     * 根据渠道ID查询是否需要透传订单价格
     *
     * @param channelId
     * @return
     * @throws PlatException
     */
    boolean checkShowOrderPrice(Integer channelId) throws PlatException;

    /**
     * 修改渠道默认系数
     *
     * @param channelCityPriceRatio the channel city price ratio
     * @param operator              the operator
     */
    void modifyChannelRatio(ChannelCityPriceRatioVo channelCityPriceRatio, String operator);

    /**
     * 修改渠道折扣
     *
     * @param channelCityPriceRatio the channel city price ratio
     * @param operator              the operator
     */
    void modifyChannelDiscount(ChannelCityPriceRatio channelCityPriceRatio, String operator);

    /**
     * 更新渠道最近修改时间
     *
     * @param channelId the channel id
     * @param operator  the operator
     * @return the int
     * @author xiangjunming
     * @since 2019/9/5
     */
    void modifyUpdateTimeByKey(Integer channelId, String operator);

    /**
     * 记录操作日志
     *
     * @param channelId
     * @param channelName
     * @param content
     * @param data
     */
    void createLog(Integer channelId, String channelName, String content, String data);

    /**
     * 渠道操作日志保存备注
     *
     * @param channelId   渠道ID
     * @param channelName 渠道名称
     * @param content     操作内容
     * @param data        操作数据:json值
     * @param remark      备注
     */
    void createLog(Integer channelId, String channelName, String content, String data, String remark);

    void createLog(Integer channelId, String channelName, String content, String data, String creater, String remark);

    /**
     * 获取变更内容
     *
     * @param before
     * @param after
     * @param <T>
     * @return
     */
    <T> String[] getCompareContentData(T before, T after);

    /**
     * 描述:获取全部分类信息
     *
     * @param voList 服务分类
     * @return List<KvDTO   <   Integer ,   String>>
     * @author yangshuangping
     * @since 2021/7/2 18:25
     **/
    List<KvDTO<Integer, String>> listAllChildCategory(List<ServAssCategoryVO> voList);

    /**
     * 描述:服务推广分类
     *
     * @param showType 产品分类 1后台 2前台
     * @return List<ServAssCategoryVO>
     * @author yangshuangping
     * @since 2021/7/2 18:25
     **/
    List<ServAssCategoryVO> listServCategoryByShowType(Integer showType);

    /**
     * 描述: 渠道复制成新渠道开通账户
     *
     * @param channelId channelId
     * @param mcStaff mcStaff
     * @author jiafei
     * @since 2022/3/30 19:02
     */
    void copyChannelSendChannelOpenAccount(Integer channelId, LoginStaff mcStaff);
}
